這三天總共會介紹以下六種設計模式在 GenAI 的應用,今天進入到第二天:
| 設計模式 | 重點 | GenAI 應用 | 
|---|---|---|
| 單例模式 (Singleton) | 確保全局唯一實例 | LLM 模型初始化 | 
| 工廠模式 (Factory Method) | 靈活創建對象 | 跨型態檔案讀取 | 
| 觀察者模式 (Observer) | 實現事件驅動 | 資料庫更新觸發處理 | 
| 模板模式 (Template Method) | 定義算法骨架 | 資料前處理流程框架 | 
| 裝飾器模式 (Decorator) | 動態添加功能 | 靈活組合資料處理步驟 | 
| 策略模式 (Strategy) | 動態切換算法 | 檢索策略調整 | 
class Database:
    def __init__(self):
        self._observers = []
    def attach(self, observer):
        if observer not in self._observers:
            self._observers.append(observer)
    def detach(self, observer):
        self._observers.remove(observer)
    def notify(self, data):
        for observer in self._observers:
            observer.update(data)
    def upload_data(self, data):
        print(f"上傳新數據到資料庫: {data}")
        self.notify(data)
class DataProcessor:
    def update(self, data):
        pass
class DataCleaningPipeline(DataProcessor):
    def update(self, data):
        print(f"數據清洗流程處理數據: {data}")
class FeatureExtractionPipeline(DataProcessor):
    def update(self, data):
        print(f"特徵提取流程處理數據: {data}")
class MachineLearningPipeline(DataProcessor):
    def update(self, data):
        print(f"機器學習流程處理數據: {data}")
def main():
    database = Database()
    
    cleaning_pipeline = DataCleaningPipeline()
    feature_extraction = FeatureExtractionPipeline()
    ml_pipeline = MachineLearningPipeline()
    database.attach(cleaning_pipeline)
    database.attach(feature_extraction)
    database.attach(ml_pipeline)
    database.upload_data("用戶行為數據")
    print("\n---\n")
    database.upload_data("銷售交易數據")
if __name__ == "__main__":
    main()
Database 類作為被觀察者,管理觀察者列表並在數據更新時通知它們。DataProcessor 是觀察者的抽象基類,定義了更新接口。DataCleaningPipeline、FeatureExtractionPipeline 和 MachineLearningPipeline 是具體的觀察者,實現了各自的數據處理邏輯。main 函數中,我們創建了數據庫和多個處理流程,並將處理流程附加到數據庫上。from abc import ABC, abstractmethod
class GenAIPipelineTemplate(ABC):
    def process_data(self):
        self.load_data()
        self.preprocess()
        self.feature_engineering()
        self.train_model()
        self.evaluate_model()
    def load_data(self):
        print("加載數據集")
    @abstractmethod
    def preprocess(self):
        pass
    @abstractmethod
    def feature_engineering(self):
        pass
    def train_model(self):
        print("訓練模型")
    def evaluate_model(self):
        print("評估模型性能")
class TextClassificationPipeline(GenAIPipelineTemplate):
    def preprocess(self):
        print("文本數據預處理:分詞、去停用詞")
    def feature_engineering(self):
        print("文本特徵工程:TF-IDF 轉換")
class ImageClassificationPipeline(GenAIPipelineTemplate):
    def preprocess(self):
        print("圖像數據預處理:縮放、標準化")
    def feature_engineering(self):
        print("圖像特徵工程:卷積特徵提取")
# 使用範例
def main():
    print("文本分類流程:")
    text_pipeline = TextClassificationPipeline()
    text_pipeline.process_data()
    print("\n---\n")
    print("圖像分類流程:")
    image_pipeline = ImageClassificationPipeline()
    image_pipeline.process_data()
if __name__ == "__main__":
    main()
GenAIPipelineTemplate 類定義了 GenAI 數據處理的通用流程,包括數據加載、預處理、特徵工程、模型訓練和評估等步驟。preprocess 和 feature_engineering 方法被定義為抽象方法,要求子類必須實現這些步驟。TextClassificationPipeline 和 ImageClassificationPipeline 是具體的子類,它們實現了特定於文本和圖像數據的預處理和特徵工程步驟。最後兩個案例會在明天繼續介紹:)
ref.
Refactoring.Guru | design-patterns